﻿Imports System.Data.SqlClient
Imports System.IO

Public Class Acceso_Datos

    Public conexion As New SqlConnection("Data Source=.\SQLExpress;Initial Catalog=protozoo;Integrated Security=TRUE")
    Private _buscar_cli As Object

    '--------------   GESTIÓN DE USUARIOS   --------------------------------------------

    Public Function devuelve_usu_by_psw_us(ByVal us As String, ByVal psw As String) As Usuario
        Dim u As Usuario = Nothing

        Dim ordenSql As New SqlCommand("select * from usuarios where nombre = @nombre and psw=@psw", conexion)

        ordenSql.Parameters.AddWithValue("@nombre", us)
        ordenSql.Parameters.AddWithValue("@psw", psw)
        conexion.Open()

        Dim res As SqlDataReader = ordenSql.ExecuteReader


        Try
            res.Read()
            Dim id = res("id_usuario")
            Dim tipo = res("tipo")
            Dim telefono = res("telefono")
            Dim direccion = res("direccion")
            Dim email = res("email")

            u = New Usuario(id, us, psw, tipo, telefono, direccion, email)


        Catch ex As Exception
            u = Nothing
            guardar_log(ex.Message)
            'MsgBox("Error: " & ex.Message)

            Return (u)

        Finally
            conexion.Close()

        End Try

        Return u

    End Function

    Public Function buscar_citas(ByVal datasete As DataSet, ByVal usuario As String, ByVal fecha As String) As DataSet

        Dim query As String = "select citas.id_cita,mascotas.nombre, citas.servicio,citas.veterinario,CONVERT(VARCHAR(5),citas.fecha,108) as hora,CONVERT(VARCHAR(10),citas.fecha,103)as fecha, CITAS.ASISTIO  from citas,mascotas where  citas.id_mascota=mascotas.id_mascota and citas.fecha >='" + fecha + "' and( mascotas.id_cliente=" + usuario + " or '" + usuario + "' = '') order by citas.fecha"

        Dim adaptador = New SqlDataAdapter(Query, conexion)
        datasete.Clear()

        Try
            adaptador.Fill(datasete, "citas")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try

        Return datasete

    End Function

    Public Function devuelve_citas() As DataSet

        Dim adaptador = New SqlDataAdapter("select citas.id_cita,mascotas.nombre, citas.servicio,citas.veterinario,CONVERT(VARCHAR(5),citas.fecha,108) as hora,CONVERT(VARCHAR(10),citas.fecha,103)as fecha, CITAS.ASISTIO  from citas,mascotas where  citas.id_mascota=mascotas.id_mascota and citas.fecha>GETDATE() order by citas.fecha", conexion)
        Dim miDataset = New DataSet


        Try
            adaptador.Fill(miDataset, "citas")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try
        Return miDataset

    End Function

    Public Function ver_usuarios() As DataSet

        Dim adaptad = New SqlDataAdapter("Select * from usuarios ", conexion)
        Dim miDatas = New DataSet

        Try
            adaptad.Fill(miDatas, "usuarios")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try
        Return miDatas

    End Function

    Public Function alta_usuario(ByVal nombre As String, ByVal psw As String, ByVal tipo As String, ByVal telefono As String, ByVal direccion As String, ByVal email As String) As Boolean
        Dim alta = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "insert into usuarios (nombre, psw, tipo,telefono,direccion,email) values (@nombre, @psw, @tipo,@telefono, @direccion, @email)"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@nombre", nombre)
        comando.Parameters.AddWithValue("@psw", psw)
        comando.Parameters.AddWithValue("@tipo", tipo)
        comando.Parameters.AddWithValue("@telefono", telefono)
        comando.Parameters.AddWithValue("@direccion", direccion)
        comando.Parameters.AddWithValue("@email", email)

        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            alta = True

        Catch ex As Exception
            MsgBox("Error Alta:" & ex.Message)
            guardar_log(ex.Message)
        End Try

        conexion.Close()

        Return alta
    End Function

    Public Function baja_usuario(ByVal id_usuario As String) As Boolean
        Dim baja = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "Delete from usuarios where id_usuario=@par_id_usuario"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@par_id_usuario", id_usuario)

        conexion.Open()
        Try
            comando.ExecuteNonQuery()
            baja = True

        Catch ex As SqlException
            MsgBox(ex.Message)
            guardar_log(ex.Message)
        End Try

        conexion.Close()
        Return baja
    End Function

    Public Function modifica_usuario(ByVal nombre As String, ByVal psw As String, ByVal tipo As String, ByVal telefono As String, ByVal direccion As String, ByVal email As String, ByVal id_usuario As String) As Boolean
        Dim modificacion = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "Update usuarios set nombre=@nombre, psw=@psw, tipo=@tipo,telefono=@telefono, direccion=@direccion, email=@email where id_usuario=@id_usuario"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@nombre", nombre)
        comando.Parameters.AddWithValue("@psw", psw)
        comando.Parameters.AddWithValue("@tipo", tipo)
        comando.Parameters.AddWithValue("@telefono", telefono)
        comando.Parameters.AddWithValue("@direccion", direccion)
        comando.Parameters.AddWithValue("@email", email)
        comando.Parameters.AddWithValue("@id_usuario", id_usuario)

        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            modificacion = True

        Catch ex As Exception
            MsgBox(ex.Message)
            guardar_log(ex.Message)
        End Try
        conexion.Close()
        Return modificacion

    End Function

    Public Function buscar_us(ByVal miDataset As DataSet) As DataSet
        Dim comando = New SqlCommand(("select * from usuarios where (nombre LIKE '%" & f_usuarios.tb_b_nombre.Text & "%' or '" & f_usuarios.tb_b_nombre.Text & "' ='') and (tipo LIKE '%" & f_usuarios.cb_b_tipo.Text & "%' or '" & f_usuarios.cb_b_tipo.Text & "' ='') and (telefono LIKE '%" & f_usuarios.tb_b_telefono.Text & "%' or '" & f_usuarios.tb_b_telefono.Text & "' ='')"), conexion)
        Dim adaptador = New SqlDataAdapter()
        adaptador.SelectCommand = comando
        miDataset.clear()

        Try
            adaptador.Fill(miDataset, "usuarios")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try


        Return miDataset
    End Function

    Public Function existe_us_by_nombre(ByVal nombre As String) As Boolean
        Dim existe = False

        Dim ordenSql As New SqlCommand("select * from usuarios where nombre = @nombre", conexion)

        ordenSql.Parameters.AddWithValue("@nombre", nombre)

        conexion.Open()

        Dim res As SqlDataReader = ordenSql.ExecuteReader


        Try
            res.Read()
            Dim n = res("nombre")

            If nombre = nombre Then
                existe = True
            End If

        Catch ex As Exception
            existe = False
            guardar_log(ex.Message)

        Finally
            conexion.Close()

        End Try
        Return existe
    End Function

    Public Function devuelve_us_by_nombre(ByVal nombre As String) As Usuario
        Dim u As Usuario = Nothing

        Dim ordenSql As New SqlCommand("select * from usuarios where nombre = @nombre", conexion)
        ordenSql.Parameters.AddWithValue("@nombre", nombre)
        conexion.Open()

        Dim res As SqlDataReader = ordenSql.ExecuteReader

        Try
            res.Read()
            Dim id = res("id_usuario")
            Dim psw = res("psw")
            Dim tipo = res("tipo")
            Dim telefono = res("telefono")
            Dim direccion = res("direccion")
            Dim email = res("email")

            u = New Usuario(id, nombre, psw, tipo, telefono, direccion, email)


        Catch ex As Exception
            u = Nothing
            'MsgBox("Error: " & ex.Message)
            guardar_log(ex.Message)
            Return u

        Finally
            conexion.Close()

        End Try

        Return u
    End Function

    '--------------  GESTIÓN DE CLIENTES   ---------------------------------------------

    Public Function ver_clientes() As DataSet
        Dim adaptador = New SqlDataAdapter("Select * from clientes", conexion)
        Dim miDataset = New DataSet


        Try
            adaptador.Fill(miDataset, "clientes")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try
        Return miDataset
    End Function

    Public Function buscar_cli(ByVal miDataset As DataSet) As DataSet
        Dim comando = New SqlCommand(("select * from clientes where (nombre LIKE '%" & f_clientes.tb_b_nombre.Text & "%' or '" & f_clientes.tb_b_nombre.Text & "' ='') and (apellidos LIKE '%" & f_clientes.tb_b_apellidos.Text & "%' or '" & f_clientes.tb_b_apellidos.Text & "' ='') and (telefono LIKE '%" & f_clientes.tb_b_telefono.Text & "%' or '" & f_clientes.tb_b_telefono.Text & "' ='')"), conexion)
        Dim adaptador = New SqlDataAdapter()
        adaptador.SelectCommand = comando

        miDataset.Clear()
        Try
            adaptador.Fill(miDataset, "clientes")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try


        Return miDataset
    End Function

    Function baja_cliente(ByVal id_cliente As String) As Boolean
        Dim baja = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "Delete from clientes where id_cliente=@par_id_cliente"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@par_id_cliente", id_cliente)

        conexion.Open()
        Try
            comando.ExecuteNonQuery()
            baja = True

        Catch ex As SqlException
            If (ex.ErrorCode = (-2146232060)) Then
                MsgBox("No puedes borrar este cliente porque tiene mascotas asociados" & vbCrLf & "Elimine primero las mascotas")
            Else
                MsgBox(ex.Message)
            End If
            guardar_log(ex.Message)

        End Try

        conexion.Close()
        Return baja
    End Function

    Function alta_cliente(ByVal nombre As String, ByVal apellidos As String, ByVal telefono As String, ByVal direccion As String, ByVal email As String) As Boolean
        Dim alta = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "insert into clientes (nombre, apellidos,telefono,direccion,email) values (@nombre, @apellidos,@telefono, @direccion, @email)"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@nombre", nombre)
        comando.Parameters.AddWithValue("@apellidos", apellidos)
        comando.Parameters.AddWithValue("@telefono", telefono)
        comando.Parameters.AddWithValue("@direccion", direccion)
        comando.Parameters.AddWithValue("@email", email)

        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            alta = True

        Catch ex As Exception
            MsgBox("Error Alta:" & ex.Message)
            guardar_log(ex.Message)

        End Try

        conexion.Close()

        Return alta
    End Function

    Function modifica_cliente(ByVal nombre As String, ByVal apellidos As String, ByVal telefono As String, ByVal direccion As String, ByVal email As String, ByVal id_cliente As String) As Boolean
        Dim modificacion = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "Update clientes set nombre=@nombre, apellidos=@apellidos,telefono=@telefono, direccion=@direccion, email=@email where id_cliente=@id_cliente"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@nombre", nombre)
        comando.Parameters.AddWithValue("@apellidos", apellidos)
        comando.Parameters.AddWithValue("@telefono", telefono)
        comando.Parameters.AddWithValue("@direccion", direccion)
        comando.Parameters.AddWithValue("@email", email)
        comando.Parameters.AddWithValue("@id_cliente", id_cliente)

        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            modificacion = True

        Catch ex As Exception
            MsgBox(ex.Message)
            guardar_log(ex.Message)
        End Try
        conexion.Close()
        Return modificacion
    End Function

    '--------------  GESTIÓN DE PROVEEDORES   ---------------------------------------------

    Public Function ver_proveedores() As DataSet
        Dim adaptador = New SqlDataAdapter("Select * from proveedores", conexion)
        Dim miDataset = New DataSet

        Try
            adaptador.Fill(miDataset, "proveedores")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try
        Return miDataset
    End Function

    Function buscar_pro(ByVal miDataset As DataSet) As DataSet
        Dim comando = New SqlCommand(("select * from proveedores where (nombre LIKE '%" & f_proveedores.tb_b_nombre.Text & "%' or '" & f_proveedores.tb_b_nombre.Text & "' ='') and (direccion LIKE '%" & f_proveedores.tb_b_direccion.Text & "%' or '" & f_proveedores.tb_b_direccion.Text & "' ='') and (telefono LIKE '%" & f_proveedores.tb_b_telefono.Text & "%' or '" & f_proveedores.tb_b_telefono.Text & "' ='')"), conexion)
        Dim adaptador = New SqlDataAdapter()
        adaptador.SelectCommand = comando

        miDataset.Clear()
        Try
            adaptador.Fill(miDataset, "proveedores")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try


        Return miDataset
    End Function

    Function modifica_proveedor(ByVal nombre As String, ByVal telefono As String, ByVal direccion As String, ByVal email As String, ByVal id_proveedor As String) As Boolean
        Dim modificacion = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "Update proveedores set nombre=@nombre, telefono=@telefono, direccion=@direccion, email=@email where id_proveedor=@id_proveedor"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@nombre", nombre)
        comando.Parameters.AddWithValue("@telefono", telefono)
        comando.Parameters.AddWithValue("@direccion", direccion)
        comando.Parameters.AddWithValue("@email", email)
        comando.Parameters.AddWithValue("@id_proveedor", id_proveedor)

        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            modificacion = True

        Catch ex As Exception
            MsgBox(ex.Message)
            guardar_log(ex.Message)
        End Try
        conexion.Close()
        Return modificacion
    End Function

    Function alta_proveedores(ByVal nombre As String, ByVal telefono As String, ByVal direccion As String, ByVal email As String) As Boolean
        Dim alta = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "insert into proveedores (nombre,telefono,direccion,email) values (@nombre,@telefono, @direccion, @email)"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@nombre", nombre)
        comando.Parameters.AddWithValue("@telefono", telefono)
        comando.Parameters.AddWithValue("@direccion", direccion)
        comando.Parameters.AddWithValue("@email", email)

        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            alta = True

        Catch ex As Exception
            MsgBox("Error Alta:" & ex.Message)
            guardar_log(ex.Message)
        End Try

        conexion.Close()

        Return alta
    End Function

    Function baja_proveedor(ByVal id_proveedor As String) As Boolean
        Dim baja = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "Delete from proveedores where id_proveedor=@id_proveedor"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@id_proveedor", id_proveedor)

        conexion.Open()
        Try
            comando.ExecuteNonQuery()
            baja = True

        Catch ex As SqlException

            If (ex.ErrorCode = (-2146232060)) Then
                MsgBox("No puedes borrar este proveedor porque tiene productos asociados" & vbCrLf & "Elimine primero los productos")
            Else
                MsgBox(ex.Message)
            End If
            guardar_log(ex.Message)
        End Try

        conexion.Close()
        Return baja
    End Function

    '--------------  GESTIÓN DE PRODUCTOS   ---------------------------------------------

    Public Function ver_productos() As DataSet

        Dim adaptador = New SqlDataAdapter("Select productos.nombre nombre_producto, productos.id_producto id_producto, proveedores.id_proveedor id_proveedor_p, categorias.id_categoria id_categoria_p, categorias.nombre nombre_categoria, proveedores.nombre nombre_proveedor from productos, proveedores, categorias where productos.id_proveedor = proveedores.id_proveedor and productos.id_categoria = categorias.id_categoria", conexion)
        Dim miDataset = New DataSet

        Try
            adaptador.Fill(miDataset, "productos")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try
        Return miDataset

    End Function

    Public Function buscar_productos(ByVal miDataset As DataSet) As DataSet

        Dim comando = New SqlCommand(("Select productos.nombre nombre_producto, productos.id_producto id_producto_p, productos.id_proveedor id_proveedor_p, productos.id_categoria id_categoria_p, categorias.nombre nombre_categoria, proveedores.nombre nombre_proveedor from productos, proveedores, categorias where(productos.id_proveedor = proveedores.id_proveedor)and (productos.id_categoria = categorias.id_categoria) and (productos.nombre LIKE '%" & f_productos.tb_b_nombre.Text & "%' or '" & f_productos.tb_b_nombre.Text & "' ='') and (categorias.nombre LIKE '%" & f_productos.tb_b_categoria.Text & "%' or '" & f_productos.tb_b_categoria.Text & "' ='') and (proveedores.nombre LIKE '%" & f_productos.tb_b_proveedor.Text & "%' or '" & f_productos.tb_b_proveedor.Text & "' ='')"), conexion)
        Dim adaptador = New SqlDataAdapter()
        adaptador.SelectCommand = comando

        miDataset.Clear()
        Try
            adaptador.Fill(miDataset, "productos")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try

       
        Return miDataset
    End Function

    Public Function baja_producto(ByVal id_producto As String) As Boolean
        Dim baja = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "Delete from productos where id_producto=@id_producto"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@id_producto", id_producto)

        conexion.Open()
        Try
            comando.ExecuteNonQuery()
            baja = True

        Catch ex As SqlException
            MsgBox(ex.Message)
            guardar_log(ex.Message)
        End Try

        conexion.Close()
        Return baja
    End Function

    Public Function modifica_producto(ByVal nombre As String, ByVal id_categoria As String, ByVal id_producto As String, ByVal id_proveedor As String) As Boolean
        Dim modificacion = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "Update productos set nombre=@nombre, id_proveedor=@id_proveedor, id_categoria=@id_categoria where id_producto=@id_producto"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@nombre", nombre)
        comando.Parameters.AddWithValue("@id_proveedor", id_proveedor)
        comando.Parameters.AddWithValue("@id_categoria", id_categoria)
        comando.Parameters.AddWithValue("@id_producto", id_producto)

        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            modificacion = True

        Catch ex As Exception
            MsgBox(ex.Message)
            guardar_log(ex.Message)
        End Try
        conexion.Close()
        Return modificacion
    End Function

    Public Function alta_producto(ByVal nombre As String, ByVal id_proveedor As String, ByVal id_categoria As String) As Boolean
        Dim alta = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "insert into productos (nombre,id_proveedor,id_categoria) values (@nombre,@id_proveedor, @id_categoria)"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@nombre", nombre)
        comando.Parameters.AddWithValue("@id_proveedor", id_proveedor)
        comando.Parameters.AddWithValue("@id_categoria", id_categoria)

        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            alta = True

        Catch ex As Exception
            MsgBox("Error Alta:" & ex.Message)
            guardar_log(ex.Message)
        End Try

        conexion.Close()
        Dim adaptador = New SqlDataAdapter(" Select id_producto FROM productos ORDER BY id_producto DESC", conexion)
        Dim miDataset = New DataSet


        adaptador.Fill(miDataset, "proc")

        Dim id = miDataset.Tables("proc").Rows(0)("id_producto")








        Dim comando2 As SqlCommand
        Dim ordenSql2 As String = "insert into stock (id_producto,cantidad,precio_compra,precio_venta,unidades_vendidas) values (@nombre,0, 10,15,0)"
        comando2 = New SqlCommand(ordenSql2, conexion)

        comando2.Parameters.AddWithValue("@nombre", id)


        'GUARDAR

        conexion.Open()
        Try
            comando2.ExecuteNonQuery() 'Ejecutar la query
            alta = True

        Catch ex As Exception
            MsgBox("Error Alta:" & ex.Message)
            guardar_log(ex.Message)
        End Try

        conexion.Close()

        Return alta
    End Function

    '--------------  GESTIÓN DE STOCKS   ---------------------------------------------

    Public Function devuelveStocks() As DataSet
        Dim adaptador As New SqlDataAdapter("Select productos.id_producto, productos.nombre,stock.cantidad,stock.precio_compra,stock.precio_venta,stock.unidades_vendidas,(stock.cantidad + stock.unidades_vendidas)*precio_compra  as gastos,stock.unidades_vendidas*stock.precio_venta as ingresos,( (stock.unidades_vendidas*stock.precio_venta)-(stock.cantidad + stock.unidades_vendidas)*precio_compra)  as beneficios from productos,stock where productos.id_producto=stock.id_producto", conexion)
        Dim miDataset = New DataSet

        Try
            adaptador.Fill(miDataset, "productos")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try
        Return miDataset

    End Function

    Function ver_categorias() As DataSet
        Dim adaptador = New SqlDataAdapter("Select * from categorias", conexion)
        Dim miDataset = New DataSet

        Try
            adaptador.Fill(miDataset, "categorias")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try
        Return miDataset
    End Function

    Public Function dameProveedores() As DataSet
        Dim adaptador As New SqlDataAdapter("Select * from proveedores", conexion)
        Dim miDataset = New DataSet

        Try
            adaptador.Fill(miDataset, "proveedores")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try

        Return miDataset
    End Function

    Public Function buscarStocks(ByVal nombre As String, ByVal categoria As Integer, ByVal proveedor As Integer) As DataSet


        Dim comando = New SqlCommand(("Select productos.id_producto,productos.nombre,stock.cantidad,stock.precio_compra,stock.precio_venta,stock.unidades_vendidas,(stock.cantidad + stock.unidades_vendidas)*precio_compra  as gastos,stock.unidades_vendidas*stock.precio_venta as ingresos,( (stock.unidades_vendidas*stock.precio_venta)-(stock.cantidad + stock.unidades_vendidas)*precio_compra)  as beneficios from productos,stock where productos.id_producto=stock.id_producto and (productos.nombre LIKE '%" + nombre + "%' or @nombre ='')and (productos.id_proveedor= @numeroCategoria or  @numeroCategoria=3)and(productos.id_categoria= @numeroProveedor or @numeroProveedor=2 ) "), conexion)
        Dim adaptador = New SqlDataAdapter()
        adaptador.SelectCommand = comando
        comando.Parameters.AddWithValue("@numeroCategoria", categoria)
        comando.Parameters.AddWithValue("@numeroProveedor", proveedor)
        comando.Parameters.AddWithValue("@nombre", nombre)

        Dim dataset As New DataSet

        Try
            adaptador.Fill(dataset, "productos")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try

        Return dataset

    End Function

    Public Function actualiza_stock(ByVal cantidad As Integer, ByVal id_producto As Integer) As Boolean

        Dim modificacion = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "Update stock set cantidad=cantidad + @cantidad where id_producto = @id_producto"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@cantidad", cantidad)
        comando.Parameters.AddWithValue("@id_producto", id_producto)


        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            modificacion = True

        Catch ex As Exception
            MsgBox(ex.Message)
            guardar_log(ex.Message)
        End Try
        conexion.Close()
        Return modificacion


    End Function

    Public Function resta_stock(ByVal cantidad As Integer, ByVal id_producto As Integer) As Boolean

        Dim modificacion = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "Update stock set cantidad=cantidad - @cantidad, unidades_vendidas=unidades_vendidas+  @cantidad where id_producto = @id_producto"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@cantidad", cantidad)
        comando.Parameters.AddWithValue("@id_producto", id_producto)


        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            modificacion = True

        Catch ex As Exception
            MsgBox(ex.Message)
            guardar_log(ex.Message)
        End Try
        conexion.Close()
        Return modificacion


    End Function

    '------------------------  GESTIÓN DE CITAS   ---------------------------------------------

    Public Function confirmar_cita(ByVal id_cita As Integer) As Boolean
        Dim modificacion = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "Update citas set asistio='SI' where id_cita=@id_cita "
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@id_cita", id_cita)


        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            modificacion = True

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        conexion.Close()
        Return modificacion



    End Function

    Public Function dame_mascotas_por_ciente(ByVal cliente As String)

        Dim adaptador As New SqlDataAdapter("Select mascotas.id_mascota, mascotas.nombre from mascotas,clientes where mascotas.id_cliente=clientes.id_cliente and (clientes.id_cliente = 1 or clientes.nombre like '%" & cliente & "%' or clientes.apellidos like '%" & cliente & "%')", conexion)

        Dim datesat As New DataSet

        Try
            adaptador.Fill(datesat, "mascotasDeCliente")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try



        Return datesat

    End Function

    Public Function modifica_cita(ByVal id_cita As String, ByVal consulta As String, ByVal empleado As String, ByVal fecha As String, ByVal hora As String) As Boolean
        Dim alta = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "update citas set servicio='" + consulta + "',veterinario='" + empleado + "' , fecha='" + fecha + " " + hora + "' where id_cita=" + id_cita
        comando = New SqlCommand(ordenSql, conexion)


        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            alta = True

        Catch ex As Exception
            MsgBox("Error Modifica:" & ex.Message)
        End Try

        conexion.Close()

        Return alta

    End Function

    Public Function elimina_cita(ByVal id_cita As String) As Boolean
        Dim alta = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "delete from citas where id_cita=" + id_cita

        comando = New SqlCommand(ordenSql, conexion)


        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            alta = True

        Catch ex As Exception
            MsgBox("Error Modifica:" & ex.Message)
        End Try

        conexion.Close()

        Return alta

    End Function

    Public Function alta_cita(ByVal id_mascota As String, ByVal consulta As String, ByVal empleado As String, ByVal fecha As String, ByVal hora As String) As Boolean
        Dim alta = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "insert into citas (id_mascota,servicio, fecha, veterinario, asistio) values(" + id_mascota + ", '" + consulta + "', '" + fecha + " " + hora + "', '" + empleado + "','NO')"
        comando = New SqlCommand(ordenSql, conexion)


        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            alta = True

        Catch ex As Exception
            MsgBox("Error Modifica:" & ex.Message)
        End Try

        conexion.Close()

        Return alta

    End Function

    '-------------------------  GESTIÓN DE MASCOTAS   ---------------------------------------------

    Public Function ver_mascotas() As DataSet
        Dim adaptador = New SqlDataAdapter("SELECT mascotas.nombre, mascotas.id_mascota, mascotas.adopcion, mascotas.id_cliente, clientes.nombre + ' ' + clientes.apellidos AS dueno FROM mascotas INNER JOIN clientes ON mascotas.id_cliente = clientes.id_cliente", conexion)
        Dim miDataset = New DataSet


        Try
            adaptador.Fill(miDataset, "mascotas")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try


        Return miDataset
    End Function

    Public Function buscar_mascotas(ByVal miDataset As DataSet) As Object
        Dim valor = f_mascotas.tb_b_dueno.Text
        Dim comando = New SqlCommand(("SELECT mascotas.nombre, mascotas.id_mascota, mascotas.adopcion, mascotas.id_cliente, clientes.nombre + ' ' + clientes.apellidos AS dueno FROM mascotas INNER JOIN clientes ON mascotas.id_cliente = clientes.id_cliente and ((clientes.nombre + ' ' + clientes.apellidos)LIKE '%" & f_mascotas.tb_b_dueno.Text & "%' or '" & f_mascotas.tb_b_dueno.Text & "' ='')and (mascotas.adopcion LIKE '%" & f_mascotas.cb_b_adopcion.Text & "%' or '" & f_mascotas.cb_b_adopcion.Text & "' ='')and (mascotas.nombre LIKE '%" & f_mascotas.tb_b_nombre.Text & "%' or '" & f_mascotas.tb_b_nombre.Text & "' ='')"), conexion)
        Dim adaptador = New SqlDataAdapter()
        adaptador.SelectCommand = comando

        miDataset.Clear()
        Try
            adaptador.Fill(miDataset, "mascotas")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try


        Return miDataset
    End Function

    Public Function alta_mascota(ByVal nombre As String, ByVal id_dueno As String, ByVal adopcion As String) As Boolean
        Dim alta = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "insert into mascotas (nombre,id_cliente,adopcion) values (@nombre,@id_dueno, @adopcion)"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@nombre", nombre)
        comando.Parameters.AddWithValue("@id_dueno", id_dueno)
        comando.Parameters.AddWithValue("@adopcion", adopcion)

        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            alta = True

        Catch ex As Exception
            MsgBox("Error Alta:" & ex.Message)
            guardar_log(ex.Message)
        End Try

        conexion.Close()

        Return alta
    End Function

    Public Function modifica_mascota(ByVal nombre As String, ByVal id_dueno As Object, ByVal adopcion As String, ByVal id_mascota As String) As Boolean


        Dim modificacion = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "Update mascotas set nombre=@nombre, id_cliente=@id_dueno, adopcion=@adopcion where id_mascota=@id_mascota"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@nombre", nombre)
        comando.Parameters.AddWithValue("@id_mascota", id_mascota)
        comando.Parameters.AddWithValue("@id_dueno", id_dueno)
        comando.Parameters.AddWithValue("@adopcion", adopcion)

        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            modificacion = True

        Catch ex As Exception
            MsgBox(ex.Message)
            guardar_log(ex.Message)

        End Try
        conexion.Close()
        Return modificacion

    End Function

    Public Function baja_mascota(ByVal id_mascota As String) As Boolean
        Dim baja = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "Delete from mascotas where id_mascota=@id_mascota"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@id_mascota", id_mascota)

        conexion.Open()
        Try
            comando.ExecuteNonQuery()
            baja = True

        Catch ex As SqlException
            If (ex.ErrorCode = (-2146232060)) Then
                MsgBox("No puedes borrar esta mascota porque tiene una cita pendiente" & vbCrLf & "Elimine primero la cita")
            Else
                MsgBox(ex.Message)
            End If
            guardar_log(ex.Message)

        End Try

        conexion.Close()
        Return baja
    End Function

    '--------------------------------------  AGENDA   ---------------------------------------------

    Function buscar_agenda() As Object
        Dim comando = New SqlCommand(("select * from proveedores where (nombre LIKE '%" & f_agenda.tb_b_nombre.Text & "%' or '" & f_agenda.tb_b_nombre.Text & "' ='') and (direccion LIKE '%" & f_agenda.tb_b_direccion.Text & "%' or '" & f_agenda.tb_b_direccion.Text & "' ='') and (telefono LIKE '%" & f_agenda.tb_b_telefono.Text & "%' or '" & f_agenda.tb_b_telefono.Text & "' ='')"), conexion)
        Dim adaptador = New SqlDataAdapter()
        adaptador.SelectCommand = comando
        Dim miDataset = New DataSet
        Try
            adaptador.Fill(miDataset, "proveedores")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try

        
        Return miDataset
    End Function

    '--------------------------------------  LOG   ---------------------------------------------

    Public Sub guardar_log(ByVal mensaje As String)
        Dim fecha As Date = Now
        Dim objStreamWriter As StreamWriter

        objStreamWriter = New StreamWriter("..\..\Resources\log.txt", True)

        objStreamWriter.WriteLine("Fecha: " & fecha & "     Error:   -" & mensaje)

        objStreamWriter.Close()

    End Sub

    '--------------------------------------  ADOPTAR   ---------------------------------------------

    Function ver_mascotas_adopcion() As DataSet


        Dim adaptador = New SqlDataAdapter("SELECT mascotas.nombre, mascotas.id_mascota, mascotas.adopcion, mascotas.id_cliente FROM mascotas where mascotas.adopcion = 'SI'", conexion)
        Dim miDataset = New DataSet


        Try
            adaptador.Fill(miDataset, "mascotas")
        Catch ex As SqlException
            MsgBox("Error: ¿Por qué metes ese caracter?")
            guardar_log(ex.Message)
        Catch e As Exception
            MsgBox("Error Adapter.Fill")
            guardar_log(e.Message)
        End Try


        Return miDataset

    End Function

    Function adoptar(ByVal id_mascota As String, ByVal id_dueno As String) As Boolean
        Dim adopcion = False
        Dim comando As SqlCommand
        Dim ordenSql As String = "Update mascotas set id_cliente=@id_dueno, adopcion=@adopcion where id_mascota=@id_mascota"
        comando = New SqlCommand(ordenSql, conexion)

        comando.Parameters.AddWithValue("@id_mascota", id_mascota)
        comando.Parameters.AddWithValue("@id_dueno", id_dueno)
        comando.Parameters.AddWithValue("@adopcion", "NO")

        'GUARDAR

        conexion.Open()
        Try
            comando.ExecuteNonQuery() 'Ejecutar la query
            adopcion = True

        Catch ex As Exception
            MsgBox(ex.Message)
            guardar_log(ex.Message)

        End Try
        conexion.Close()
        Return adopcion
    End Function

End Class
